package cn.basic.social.api.qwtalk.client;

import cn.basic.social.api.exception.ApiException;
import cn.basic.social.api.qwtalk.QwRequest;
import cn.basic.social.api.qwtalk.QwResponse;

/**
 * @ClassName BaseQwTalkClient
 * @Description 企业微信客户端接口
 * @Author zlf
 * @Date 2023/8/25 10:36
 */
public interface BaseQwTalkClient extends BaseQwClient {

    /**
     * 执行API请求
     *
     * @param <T>     具体的API响应类
     * @param request 具体的API请求类
     * @param corpid 企业ID
     * @param corpsecret 应用的凭证密钥，注意应用需要是启用状态
     * @return
     * @author zlf
     * @date 10:33 2023/8/25
     */
    public <T extends QwResponse> T doExecute(QwRequest<T> request, String corpid, String corpsecret) throws ApiException;

    /**
     * 执行API请求
     *
     * @param <T>     具体的API响应类
     * @param request 具体的API请求类
     * @param accessToken 企业自建应用或基础应用的调用接口凭证
     * @return
     * @author zlf
     * @date 10:33 2023/8/25
     */
    public <T extends QwResponse> T doExecute(QwRequest<T> request, String accessToken) throws ApiException;

    /**
     * 执行API请求
     *
     * @param <T>     具体的API响应类
     * @param request 具体的API请求类
     * @param providerAccessToken 企业自建应用或基础应用的调用接口凭证
     * @return
     * @author zlf
     * @date 10:33 2023/8/25
     */
    public <T extends QwResponse> T doProviderExecute(QwRequest<T> request, String providerAccessToken) throws ApiException;

    /**
     * 执行API请求
     *
     * @param <T>     具体的API响应类
     * @param request 具体的API请求类
     * @param suiteAccessToken 第三方应用凭证（suite_access_token)
     * @return
     * @author zlf
     * @date 10:33 2023/8/25
     */
    public <T extends QwResponse> T doAccessTokenExecute(QwRequest<T> request, String suiteAccessToken) throws ApiException;

    /**
     * 执行API请求
     *
     * @param <T>     具体的API响应类
     * @param request 具体的API请求类
     * @param accessToken 企业自建应用或基础应用的调用接口凭证
     * @param type 媒体文件类型，分别有图片（image）、语音（voice）、视频（video），普通文件（file）
     * @return
     * @author zlf
     * @date 10:33 2023/8/25
     */
    public <T extends QwResponse> T doFileExecute(QwRequest<T> request, String accessToken, String type) throws ApiException;

    /**
     * 执行API请求
     *
     * @param <T>     具体的API响应类
     * @param request 具体的API请求类
     * @param suiteAccessToken 第三方应用凭证（suite_access_token)
     * @param code 通过成员授权获取到的code，最大为512字节。每次成员授权带上的code将不一样，code只能使用一次，5分钟未被使用自动过期。
     * @return
     * @author zlf
     * @date 10:33 2023/8/25
     */
    public <T extends QwResponse> T doLoginExecute(QwRequest<T> request, String suiteAccessToken, String code) throws ApiException;

}
